/*
泛型(generic)是关于泛化类型和函数功能，以扩大其适用范围的话题。泛型极大地减少了代码的重复，但它自身的语法要求细心。
泛型最简单和常用的用法是用于类型参数。
泛型的类型参数是使用尖括号和大驼峰命名的名称: `<Aaa, Bbb, ...>`来指定的。泛型类型参数一般用 `<T>`来表示。
任何用泛型类型参数表示的类型都是泛型，其他的类型都是具体类型。
*/

// 一个具体类型 `A`
struct A;

// 在定义类型 `Single`时，第一次使用类型 `A`之前没有写 `<A>`
// 因此， `Single`是一个具体类型， `A`取上面的定义
struct Single(A);
            // ^ 这里是 `Single`对类型`A`的第一次使用

// 此处 `<T>`在第一次使用 `T`前出现，所以 `SingleGen`是一个泛型类型
// 因为`T` 是泛型的，所以它可以是任何类型，包括在上面定义的具体类型 `A`
struct SingleGen<T>(T);

fn main() {
    // `Single`是具体类型，并且显示地使用类型 `A`
    let _s = Single(A);

    // 创建一个 `SingleGen<char>` 类型的变量 `_char`，并令其值为 `SingleGen('a')`
    let _char: SingleGen<char> = SingleGen('a');

    // `SingleGen`的类型参数也可以隐式地指定
    let _t = SingleGen(A);
    let _i32 = SingleGen(6);
    let _char = SingleGen('b');
}